import axios from "axios";
import { message } from "ant-design-vue";
import { useUserStore } from "../stores/user";
import router from "../router";

// 处理未授权（401）的统一函数
const handleUnauthorized = (errorMsg = "登录已过期，请重新登录") => {
  const userStore = useUserStore();
  userStore.logout();
  // 使用setTimeout确保在状态更新后再进行路由跳转
  setTimeout(() => {
    router.push("/login");
  }, 100);
  return errorMsg;
};

const service = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 10000,
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();
    if (userStore.token) {
      config.headers["Authorization"] = `Bearer ${userStore.token}`;
    }
    return config;
  },
  (error) => {
    console.error("请求错误：", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 注意：Axios已经自动处理了非2xx的HTTP状态码，将它们转到错误回调函数中
    // 这里只需处理业务状态码
    const res = response.data;
    // 🚩 只做错误抛出，不在此弹窗提示，业务可控制是否提示
    if (res.code !== 200) {
      // 处理未登录或 Token 失效
      if (res.code === 401) {
        const errorMessage = handleUnauthorized();
        return Promise.reject(new Error(errorMessage));
      }
      return Promise.reject(new Error(res.errorMsg || "请求失败"));
    }
    return res;
  },
  (error) => {
    // 这里处理HTTP错误状态码和网络错误
    console.error("响应错误：", error);

    // 提供更详细的错误信息
    let errorMsg = "请求失败";
    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status;

      // 处理HTTP状态码401（未授权），重定向到登录页面
      if (status === 401) {
        errorMsg = handleUnauthorized();
      } else {
        errorMsg = `请求错误: ${status} ${error.response.statusText}`;
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      errorMsg = "服务器无响应";
    } else {
      // 请求配置出错
      errorMsg = error.message;
    }

    message.error(errorMsg);
    return Promise.reject(error);
  }
);

export default service;
